package cn.iocoder.yudao.module.design.service.flowtask;

import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.design.controller.admin.flowtask.vo.*;
import cn.iocoder.yudao.module.design.dal.dataobject.flowtask.FlowTaskCountDO;
import cn.iocoder.yudao.module.design.dal.dataobject.flowtask.FlowTaskDO;

import javax.validation.Valid;
import java.util.*;

/**
 * 待办任务 Service 接口
 *
 * @author 芋道源码
 */
public interface FlowTaskService {

    /**
     * 创建待办任务
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createFlowTask(@Valid FlowTaskCreateReqVO createReqVO);

    /**
     * 更新待办任务
     *
     * @param updateReqVO 更新信息
     */
    void updateFlowTask(@Valid FlowTaskUpdateReqVO updateReqVO);

    void updateFlowTaskDealerId(Long houseId, Long oldUserId, Long newUserId);

    /**
     * 删除待办任务
     *
     * @param id 编号
     */
    void deleteFlowTask(Long id);

    /**
     * 获得待办任务
     *
     * @param id 编号
     * @return 待办任务
     */
    FlowTaskDO getFlowTask(Long id);

    /**
     * 获得待办任务
     *
     * @param id 编号
     * @return 待办任务
     */
    FlowTaskDO getFlowTaskByNodeId(Long id);

    /**
     * 获得待办任务列表
     *
     * @param ids 编号
     * @return 待办任务列表
     */
    List<FlowTaskDO> getFlowTaskList(Collection<Long> ids);

    /**
     * 获得待办任务分页
     *
     * @param pageReqVO 分页查询
     * @return 待办任务分页
     */
    PageResult<FlowTaskDO> getFlowTaskPage(FlowTaskPageReqVO pageReqVO);

    /**
     * 获得待办任务列表, 用于 Excel 导出
     *
     * @param exportReqVO 查询条件
     * @return 待办任务列表
     */
    List<FlowTaskDO> getFlowTaskList(FlowTaskExportReqVO exportReqVO);


    /**
     * 获得待办任务列表
     *
     * @param vo 编号
     * @return 待办任务列表
     */
    List<FlowTaskDO> getFlowTaskList(FlowTaskBaseVO vo );


    /**
     * 通过flowTaskId流转待办任务
     *
     * @param id 编号
     * @return 待办任务列表
     */
    void submitFlowTaskList(Long id);

    /**
     * 通过节点id流转待办任务
     *
     * @param flowTaskCustomizeVo 编号
     */
    void submitFlowTaskListByNodeId(FlowTaskCustomizeVo flowTaskCustomizeVo);

    /**
     * 任务补充
     * @param vo
     */
    void replenishTask(FlowTaskBaseVO vo );

    /**
     * 任务回退
     * @param vo
     */
    void rollbackTask(FlowTaskBaseVO vo );


    FlowTaskBaseVO  getFlowTaskDetailById(Long id);

    Object dealFolwTask(CommonFlowTaskActionVo vo) throws Throwable;

    /**
     * 查询项目内个人 任务数量
     * @param houseId 项目id
     * @return count
     */
    int  getTaskCount(Long houseId);

    /**
     * 查询项目内个人 任务数量
     * @param houseId 项目id
     * @return count
     */
    List<FlowTaskCountDO>  getTaskCountList(Collection<Long> ids);


    default Map<Long, FlowTaskCountDO> getTaskCountMap(Collection<Long> ids) {
        if (CollUtil.isEmpty(ids)) {
            return new HashMap<>();
        }
        return CollectionUtils.convertMap(getTaskCountList(ids), FlowTaskCountDO::getHouseId);
    }

    void createUserRelFlowTask(Long houseId,String projectName,Long userId,Long roleId);


    void createHouseUserRelFlowTask(Long houseId, String projectName, Long userId, Long roleId, Integer statusCd) ;



    void deleteFlowTaskByHouseIdAndUserId(Long houseId, Set<Long> userId, Integer taskType);
}
